#ifndef RATINGWIDGET_H
#define RATINGWIDGET_H

#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QHeaderView>
#include <QLabel>
#include <QPushButton>
#include <QComboBox>
#include <QDateEdit>
#include <QLineEdit>
#include <QGroupBox>
#include <QSplitter>
#include <QTextEdit>
#include <QProgressBar>
#include <QTimer>
#include <QMessageBox>
#include <QInputDialog>
#include <QScrollArea>
#include <QFrame>
#include <QDialog>
#include <QSpinBox>
#include <QDateTime>
#include "../data/models.h"
#include "../business/ratingmanager.h"
#include "../business/ordermanager.h"

// 使用命名空间
using namespace RestaurantSystem;

/**
 * @brief 订单评价管理组件
 * 
 * 提供用户订单评价功能：
 * - 查看可评价订单列表
 * - 创建和编辑评价
 * - 查看评价历史
 * - 评价统计展示
 * - 1024*600分辨率优化
 */
class RatingWidget : public QWidget
{
    Q_OBJECT

public:
    explicit RatingWidget(QWidget *parent = nullptr);
    ~RatingWidget();

    /**
     * @brief 设置当前用户名
     * @param userName 用户名
     */
    void setUserName(const QString& userName);
    
    /**
     * @brief 刷新评价数据
     */
    void refreshRatings();
    
    /**
     * @brief 清空数据
     */
    void clearData();

signals:
    /**
     * @brief 数据刷新请求信号
     */
    void dataRefreshRequested();

public slots:
    /**
     * @brief 处理评价数据更新
     */
    void onRatingsUpdated();
    
    /**
     * @brief 处理操作错误
     * @param errorMessage 错误信息
     */
    void onOperationError(const QString& errorMessage);

private slots:
    /**
     * @brief 刷新按钮点击槽
     */
    void onRefreshButtonClicked();
    
    /**
     * @brief 星级点击槽
     */
    void onStarClicked();
    
    /**
     * @brief 星级悬停槽
     */
    void onStarHovered();
    
    /**
     * @brief 快速评价按钮点击槽
     */
    void onQuickRateClicked();
    
    /**
     * @brief 创建评价按钮点击槽
     */
    void onCreateRatingClicked();
    
    /**
     * @brief 编辑评价按钮点击槽
     */
    void onEditRatingClicked();
    
    /**
     * @brief 删除评价按钮点击槽
     */
    void onDeleteRatingClicked();
    
    /**
     * @brief 可评价订单表格选择变化槽
     */
    void onRatableOrderSelectionChanged();
    
    /**
     * @brief 评价历史表格选择变化槽
     */
    void onRatingHistorySelectionChanged();
    
    /**
     * @brief 可评价订单表格双击槽
     */
    void onRatableOrderDoubleClicked(int row, int column);
    
    /**
     * @brief 评价历史表格双击槽
     */
    void onRatingHistoryDoubleClicked(int row, int column);
    
    /**
     * @brief 筛选条件变化槽
     */
    void onFilterChanged();
    
    /**
     * @brief 订单完成槽函数
     */
    void onOrderCompleted(const QString& orderId);

private:
    /**
     * @brief 初始化界面
     */
    void initializeUI();
    
    /**
     * @brief 创建可评价订单区域
     */
    void createRatableOrdersArea();
    
    /**
     * @brief 创建评价历史区域
     */
    void createRatingHistoryArea();
    
    /**
     * @brief 创建评价统计区域
     */
    void createRatingStatisticsArea();
    
    /**
     * @brief 创建操作按钮区域
     */
    void createActionArea();
    
    /**
     * @brief 创建标题栏
     */
    void createTitleBar();
    
    /**
     * @brief 创建可评价订单卡片区域
     */
    void createRatableOrderCardsArea();
    
    /**
     * @brief 创建订单卡片
     */
    void createOrderCards(const QList<Order>& orders);
    
    /**
     * @brief 清除订单卡片
     */
    void clearOrderCards();
    
    /**
     * @brief 更新星级显示
     */
    void updateStarDisplay(const QString& orderId, int rating, bool isHover);
    
    /**
     * @brief 创建菜品图片区域
     */
    QWidget* createFoodImagesArea(const Order& order);
    
    /**
     * @brief 根据菜品名称获取默认图片
     */
    QString getDefaultFoodImage(const QString& itemName);
    
    /**
     * @brief 应用样式表
     */
    void applyStyleSheet();
    
    /**
     * @brief 设置表格属性
     */
    void setupTableProperties();
    
    /**
     * @brief 加载可评价订单
     */
    void loadRatableOrders();
    
    /**
     * @brief 加载评价历史
     */
    void loadRatingHistory();
    
    /**
     * @brief 更新评价统计
     */
    void updateRatingStatistics();
    
    /**
     * @brief 填充可评价订单表格
     * @param orders 订单列表
     */
    void populateRatableOrderTable(const QList<Order>& orders);
    
    /**
     * @brief 填充评价历史表格
     * @param ratings 评价列表
     */
    void populateRatingHistoryTable(const QList<Rating>& ratings);
    
    /**
     * @brief 更新界面状态
     */
    void updateUIState();
    
    /**
     * @brief 显示操作结果
     * @param message 结果信息
     * @param success 是否成功
     */
    void showOperationResult(const QString& message, bool success = true);
    
    /**
     * @brief 显示评价对话框
     * @param orderId 订单ID
     * @param existingRating 现有评价(编辑模式)
     */
    void showRatingDialog(const QString& orderId, const Rating& existingRating = Rating());
    
    /**
     * @brief 格式化订单状态
     * @param status 订单状态
     * @return 格式化后的状态文本
     */
    QString formatOrderStatus(OrderStatus status) const;
    
    /**
     * @brief 格式化金额
     * @param amount 金额
     * @return 格式化后的金额字符串
     */
    QString formatAmount(double amount) const;
    
    /**
     * @brief 格式化时间
     * @param dateTime 时间
     * @return 格式化后的时间字符串
     */
    QString formatDateTime(const QDateTime& dateTime) const;
    
    /**
     * @brief 获取选中的可评价订单
     * @return 选中的订单，未选中则返回无效订单
     */
    Order getSelectedRatableOrder() const;
    
    /**
     * @brief 获取选中的评价
     * @return 选中的评价，未选中则返回无效评价
     */
    Rating getSelectedRating() const;

private:
    // 主布局
    QVBoxLayout* m_mainLayout;
    QSplitter* m_mainSplitter;
    
    // 可评价订单区域
    QGroupBox* m_ratableOrderGroup;
    QVBoxLayout* m_ratableOrderLayout;
    QTableWidget* m_ratableOrderTable;
    QLabel* m_ratableOrderCountLabel;
    QWidget* m_emptyStateWidget;
    
    // 评价历史区域
    QGroupBox* m_ratingHistoryGroup;
    QVBoxLayout* m_ratingHistoryLayout;
    QTableWidget* m_ratingHistoryTable;
    QLabel* m_ratingHistoryCountLabel;
    
    // 评价统计区域
    QGroupBox* m_statisticsGroup;
    QVBoxLayout* m_statisticsLayout;
    QLabel* m_totalRatingsLabel;
    QLabel* m_averageRatingLabel;
    QLabel* m_satisfactionRateLabel;
    QLabel* m_ratingDistributionLabel;
    
    // 操作按钮区域
    QGroupBox* m_actionGroup;
    QHBoxLayout* m_actionLayout;
    QPushButton* m_createRatingButton;
    QPushButton* m_editRatingButton;
    QPushButton* m_deleteRatingButton;
    QPushButton* m_refreshButton;
    
    // 数据
    QString m_currentUserName;
    QList<Order> m_ratableOrders;
    QList<Rating> m_ratingHistory;
    RatingStatistics m_statistics;
    
    // 业务对象
    RatingManager* m_ratingManager;
    OrderManager* m_orderManager;
    
    // 状态标志
    bool m_isInitialized;
    bool m_isLoading;
    
    // 表格列枚举
    enum RatableOrderTableColumn {
        COL_ORDER_ID = 0,
        COL_CREATE_TIME,
        COL_TOTAL_AMOUNT,
        COL_ITEM_COUNT,
        COL_RATABLE_COUNT
    };
    
    enum RatingHistoryTableColumn {
        COL_RATING_ORDER_ID = 0,
        COL_RATING,
        COL_COMMENT,
        COL_RATING_TIME,
        COL_RATING_HISTORY_COUNT
    };
};

/**
 * @brief 评价对话框
 */
class RatingDialog : public QDialog
{
    Q_OBJECT

public:
    explicit RatingDialog(const QString& orderId, QWidget *parent = nullptr);
    explicit RatingDialog(const Rating& existingRating, QWidget *parent = nullptr);
    ~RatingDialog();

    /**
     * @brief 获取评价信息
     * @return 评价信息
     */
    Rating getRating() const;

private slots:
    void onRatingChanged(int rating);
    void onConfirmClicked();
    void onCancelClicked();

private:
    void initializeUI();
    void setupOrderInfo();
    void applyStyleSheet();

private:
    QString m_orderId;
    Rating m_existingRating;
    bool m_isEditMode;
    
    // UI组件
    QVBoxLayout* m_mainLayout;
    QGroupBox* m_orderInfoGroup;
    QLabel* m_orderIdLabel;
    QLabel* m_orderAmountLabel;
    QLabel* m_orderDateLabel;
    
    QGroupBox* m_ratingGroup;
    QHBoxLayout* m_ratingLayout;
    QList<QPushButton*> m_starButtons;
    QLabel* m_ratingTextLabel;
    
    QGroupBox* m_commentGroup;
    QTextEdit* m_commentEdit;
    
    QHBoxLayout* m_buttonLayout;
    QPushButton* m_confirmButton;
    QPushButton* m_cancelButton;
    
    int m_selectedRating;
};

#endif // RATINGWIDGET_H
